package conservare.web;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.Flash;

import org.primefaces.model.StreamedContent;

import conservare.constantes.Constante;
import conservare.modelo.banco.CarteiraBoleto;
import conservare.modelo.banco.Conta;
import conservare.modelo.financeiro.ContaAReceber;
import conservare.negocio.BancoRN;
import conservare.negocio.BoletoEmitidoRN;
import conservare.util.JSFUtil;

@ManagedBean
@ViewScoped
public class GeraBoletoBean implements Serializable{

	private static final long serialVersionUID = -1308140494803970237L;

	private ContaAReceber contaAReceber;
	//private Empresa cedenteSelecionado;
	private Conta contaBancaria;
	//private Carteira carteiraBancariaSelecionada;
	private StreamedContent file;
	private boolean boletoFoiGerado = false;
	CarteiraBoleto carteiraBoleto;
	
	private Date dataDoVencimento;
	private BigDecimal valorDoDocumento = new BigDecimal(0.0);
	private BigDecimal valorJurosMora = new BigDecimal(0.0);
	private BigDecimal valorMulta = new BigDecimal(0.0);
	
	@PostConstruct
	public void init(){
		
		this.contaBancaria = new BancoRN().getConta(Constante.CONSERVARE_NUMERO_CNPJ,  Constante.CONSERVARE_NUMERO_BANCO_CEF, Constante.CONSERVARE_NUMERO_AGENCIA_CEF, Constante.CONSERVARE_NUMERO_CONTA_CEF);
		this.carteiraBoleto = new BancoRN().getCarteira(contaBancaria, Constante.CONSERVARE_NUMERO_CARTEIRA, Constante.CONSERVARE_MODALIDADE_CARTEIRA);
		
		Flash flash = JSFUtil.flashScope();
		this.contaAReceber = ((ContaAReceber)flash.get("conta_areceber_selecionada"));
		this.dataDoVencimento = this.contaAReceber.getDataDeVencimento();
		this.valorDoDocumento = this.contaAReceber.getValorAPagar();
		doValorDocumentoBoletoAlterado();
		
		
		//this.carteiraBancariaSelecionada = new BancoRN().getCarteira(Constante.CONSERVARE_NUMERO_BANCO_CEF, 24);
		//this.cedenteSelecionado = new EmpresaRN().getByNumeroCpfCnpj(Constante.CONSERVARE_NUMERO_CNPJ);
		
	}


	public void doPercentualMultaAposVencimentoBoletoAlterado(){
		
		recalcularValorMultaAposVencimentoBoletoSelecionado();
		
	}
	
	private void recalcularValorMultaAposVencimentoBoletoSelecionado(){
		setValorMulta(new BoletoEmitidoRN().calcularValorMultaAposVencimento(this.valorDoDocumento, this.carteiraBoleto.getPercentualMulta()));
	}

	public void doPercentualJurosMoraBoletoAlterado(){
		
		recalcularValorJurosDeMoraNoBoletoSelecionado();
		
	}
	
	private void recalcularValorJurosDeMoraNoBoletoSelecionado(){
		
		setValorJurosMora(new BoletoEmitidoRN().calcularValorJurosMora(this.valorDoDocumento, this.carteiraBoleto.getPercentualJurosMora()));
		
	}
	
	public void doValorDocumentoBoletoAlterado(){
		
		recalcularValorJurosDeMoraNoBoletoSelecionado();
		recalcularValorMultaAposVencimentoBoletoSelecionado();
		
	}
	
	
	
	public Date getDataDoVencimento() {
		return dataDoVencimento;
	}


	public void setDataDoVencimento(Date dataDoVencimento) {
		this.dataDoVencimento = dataDoVencimento;
	}


	public BigDecimal getValorDoDocumento() {
		return valorDoDocumento;
	}


	public void setValorDoDocumento(BigDecimal valorDoDocumento) {
		this.valorDoDocumento = valorDoDocumento;
	}


	public BigDecimal getValorJurosMora() {
		return valorJurosMora;
	}


	public void setValorJurosMora(BigDecimal valorJurosMora) {
		this.valorJurosMora = valorJurosMora;
	}


	public BigDecimal getValorMulta() {
		return valorMulta;
	}


	public void setValorMulta(BigDecimal valorMulta) {
		this.valorMulta = valorMulta;
	}
/*

	public StreamedContent getFile() {
		
		BoletoViewer boletoViewer = gerarBoleto();
		InputStream stream = new ByteArrayInputStream(boletoViewer.getPdfAsStream().toByteArray());
		file = new DefaultStreamedContent(stream, "application/pdf", "boleto.pdf"); 
		
		boletoFoiGerado = true;
		
		return file;
	}*/
	
	/*
	public BoletoViewer gerarBoleto(){
		
		
		InfoBoletoBuilder boletoBuilder = new InfoBoletoBuilder();
		//boletoBuilder.buildCarteira(carteiraBoleto);
		boletoBuilder.buildContaAReceber(contaAReceber);
		boletoBuilder.buildContaBancaria(contaBancaria);
		boletoBuilder.buildDataDoDocumento(new Date());
		boletoBuilder.buildDataDoVencimento(dataDoVencimento);
		boletoBuilder.buildNumeroDoDocumento(InfoBoletoRN.gerarSequencialBoleto(carteiraBoleto));
		boletoBuilder.buildValorDoDocumento(valorDoDocumento);
		boletoBuilder.buildValorJurosMora(valorJurosMora);
		boletoBuilder.buildValorMulta(valorMulta);
		boletoBuilder.buildPagador(contaAReceber.getContrato().getResponsavelLocalPrestacaoServico());
		
		InfoBoleto boleto = boletoBuilder.getInfoBoleto();
		
		
		InfoBoletoRN boletoRN = new InfoBoletoRN();
		
		BoletoViewer boletoViewer = null;
		try {
			boletoViewer = boletoRN.gerarBoleto(boleto, carteiraBoleto);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		boletoRN.salvar(boleto);
		
		return boletoViewer;
		
	}
*/

	public boolean isBoletoFoiGerado() {
		return boletoFoiGerado;
	}
	
	

	
}
